home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / arcers / tar316.zip / FMATCH.C < prev    next >
Text File  |  1994-07-01  |  2KB  |  100 lines

  1. #include "modern.h"
  2. #ifdef MODERN
  3. #    include <string.h>
  4. #else
  5.     int  strlen();
  6. #endif
  7. #define ERROR (-1)
  8. #define FALSE 0
  9. #define TRUE  1
  10.  
  11. #ifdef MSDOS
  12. static int fnmatch __ARGS__((char*, char*, int));
  13.  
  14. static int fnmatch(p, s, l)
  15. register char *p; /* pattern */
  16. register char *s; /* name to compare */
  17. {
  18.    register c1, c2;
  19.  
  20.    for (; *p && l; ++p, ++s, l--) {
  21.       if (*p == '*') goto asterick;
  22.       if (*p == '?') continue;
  23.  
  24.       if ((c1 = *p) >= 'a' && c1 <= 'z') c1 -= 'z'-'Z';
  25.       else if (c1 == '\\') c1 = '/';
  26.  
  27.       if ((c2 = *s) >= 'a' && c2 <= 'z') c2 -= 'z'-'Z';
  28.       else if (c2 == '\\') c2 = '/';
  29.  
  30.       if (c1 != c2) return FALSE;
  31.    }
  32.    return !(*p || l);
  33. asterick:
  34.    while (*++p == '*');
  35.    while (l) {
  36.       if (fnmatch(p, s++, l--)) return TRUE;
  37.    }
  38.    return FALSE;
  39. }
  40.  
  41. int fmatch(p, s)
  42. register char *p; /* pattern */
  43. register char *s; /* name to compare */
  44. {
  45.    register i, j;
  46.  
  47.    if (fnmatch(p, s, (i=strlen(s)))) return TRUE;
  48.    if (!i) return FALSE;
  49.  
  50.    j = i;
  51.    do {
  52.       if (s[--j] == '.') goto dot;
  53.    } while (j && s[j]!='\\' && s[j]!='/' && s[j]!=':');
  54.  
  55.    /* No dot in the file name */
  56.    s[i] = '.'; /* Overwrite '\0' */
  57.    j = fnmatch(p, s, i+1);
  58.    s[i] = '\0';
  59.    return j;
  60. dot:
  61.    if (/* file name contains extension? */ i-j > 1 ||
  62.       !j || s[j-1]=='\\' || s[j-1]=='/' || s[j-1]==':' || s[j-1]=='.')
  63.       return FALSE;
  64.    return fnmatch(p, s, i-1);
  65. }
  66. #else
  67. int fmatch(p, s)  /* UNIX and others */
  68. register char *p; /* pattern */
  69. register char *s; /* string to compare */
  70. {
  71.    for (; *p && *s; ++p, ++s) {
  72.       if (*p == '*') {
  73.          while (*++p == '*') ;
  74.          while (*s) if (fmatch(p, s++)) return TRUE;
  75.          return FALSE;
  76.       } else if (*p != '?') {
  77.          if (*s != *p) return FALSE;
  78.       }
  79.    }
  80.    return !(*p || *s);
  81. }
  82. #endif
  83.  
  84. int mismatch __ARGS__((char*, char*, int));
  85.  
  86. int mismatch(p, s, l)
  87. register char *p, *s; int l;
  88. {
  89.    for (; *p && l; ++p, ++s, l--) {
  90.       if (*p == '*') {
  91.          while (*++p == '*');
  92.          while (l) if (!mismatch(p, s++, l--)) return FALSE;
  93.          return TRUE;
  94.       } else if (*p != '?') {
  95.          if (*s != *p) return ERROR;
  96.       }
  97.    }
  98.    return *p || l;
  99. }
  100.